<?php
/**
 * Model_Category
 * 
 * @package    Model
 * @author     Windy
 */
class Model_Category extends Zend_Db_Table_Abstract
{
	protected $_name = "post_category"; 
	//protected $_dependentTables = array ('Model_PostCategory');
	
	/**
	 * 
	 * Lấy toàn bộ chuyên mục và sắp xếp có phân cấp
	 */
	public function getAllCategories($type = 'article'){
		return $this->fetchAll($this->select()->where('type=?', $type));
	}
	/**
	 * 
	 * Lấy toàn bộ page
	 */
	public function getAllPage($type = 'page'){
		return $this->fetchAll($this->select()->where('type=?', $type));
	}
	/**
	 * Lấy ra toàn bộ post
	 * 
	 */
	function getAllPost(){
		return $this->fetchAll();
	}
	/**
	 * 
	 * Phân cấp chuyên mục 
	 * @param array $arrSorted Mảng chứa các chuyên mục đã được phân cấp (tham chiếu)
	 * @param int $parent_id Giá trị mã của chuyên mục cha
	 */
	public function sortCategories(&$arrSorted  = null, $parent_id = 0, $type = 'article'){
		
		$arrCategories = $this->fetchAll($this->select()->where('parent_id =?', $parent_id)->where('type=?',$type));
		if(count($arrCategories) > 0){
			foreach ($arrCategories as $category){
				$arrSorted[] = $category;
				$this->sortCategories($arrSorted, $category->id, $type);
			}
		}
	}
	/**
	 * 
	 * Thêm mới 1 chuyên mục
	 * @param string $name Tên chuyên mục (đã thêm ngôn ngữ)
	 * @param string $slug Slug hiển thị trên url
	 * @param string $description Miêu tả
	 * @param string $type Loại chuyên mục ('article' , 'product')
	 * @return int id autoincrement
	 */
	public function insertCategory($name, $slug, $description, $type){
		$category = $this->createRow();
		$category->name = $name;
		$category->slug = $slug;
		$category->description = $description;
		$category->type = $type;
		$category->save();
		$id = $this->_db->lastInsertId();
		return $id;
	}

	/**
	 * 
	 * Lấy chuyên mục theo mã
	 * @param int $id
	 * @return Zend_Db_Table_Row category
	 */
	public function getCategoryByID($id){
		return $this->fetchRow($this->select()->where('id =?', $id));
	}
	
	/**
	 * 
	 * Update chuyên mục
	 * @param int $id
	 * @param string $name
	 * @param string $slug
	 * @param string $description
	 * @return int số dòng được update
	 */
	public function updateCategory($id, $name, $slug, $description){
		//chuẩn bị dữ liệu
		$data = array(
					'name' => $name,
					'slug' => $slug,
					'description' => $description
				);
		try{	
			$this->update($data, 'id = '.$id);
			return true;
		}catch (Exception $e){
			echo 'Caught exception: ',  $e->getMessage(), "\n";
			return false;
		}
	
	}
	
	/**
	 * 
	 * Tìm kiếm chuyên mục theo keyword;
	 * @param string $keyword
	 * @return Zend_Db_Table_Rowset
	 */
	public function searchCategory($keyword){
		$select = $this->select()
						->where('match '.$this->_db->quoteIdentifier('name').' against (? in boolean mode)', $keyword)
						->orWhere($this->_db->quoteIdentifier('name').' like ?', '%'.$keyword.'%');
		//echo $select;
		return $this->fetchAll($select);
	}
	/**
	 * Xóa chuyên mục theo id và đồng thời xóa hết các chuyên mục con
	 * 
	 * @param int|array $id Mã các chuyên mục cần xóa
	 * @return int số bản ghi bị xóa
	 */
	public function deleteCategory($ids){
		if(is_numeric($ids)){
			return $this->delete('id='.$ids);
		}else{
			return $this->delete('id in ('.$ids.')');
		}
	}
	public function deleteChildren($id){
		$arrCategories = $this->fetchAll($this->select()->where('parent_id =?', $id));
		if(count($arrCategories) > 0){
			foreach ($arrCategories as $category){
				$this->deleteChildren($category->id);
			}
			$this->delete('parent_id='.$id);
		}
	}
}